package org.me.servlet;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Properties;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.me.entityBeans.TPaises;
import org.me.service.PaisServiceHibernate;

//Usado por mantenimientoPaises.xhtml
public class MantenimientoPaisesController {
    private PaisServiceHibernate paisServiceHibernateImpl;    
    private Short id_pais;
    private String nom_pais;
    private String nom_pais_Editar;//para compararlo al momento de grabar una actualizacion
    private Long num_habitantes;
    private TPaises tPaises;//entity bean inyectado para luego ser seteado con las propiedades de esta clase
    
    private List beanList;//Lista de paises
    private String paisExiste;//mostrar si el pais ya existe al cliente por AJAX
    
    private String color;
    
    private Properties properties;    
    private Integer numPaises;
    
    private Integer flagEditar;//Saber cuando en que estado se encuentra Nuevo o Actualizando
    
    public MantenimientoPaisesController(PaisServiceHibernate paisServiceHibernateImpl) {  
        this.paisServiceHibernateImpl = paisServiceHibernateImpl;
        
        this.setBeanList(this.getPaisServiceHibernateImpl().findAllPaises()); //traemos todos los paises para ser seteado en beanList     
        this.numPaises = this.beanList.size();
        
        this.flagEditar = 0;
        
        this.properties = new Properties();
        try{
           this.properties.load(new FileInputStream("resources/messages.properties"));
        }
        catch(IOException  e){
            //e.printStackTrace();
        }           
    }      

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getPaisExiste() {
        return paisExiste;
    }

    public void setPaisExiste(String paisExiste) {
        this.paisExiste = paisExiste;
    }
   
    public Short getId_pais() {
        return id_pais;
    }

    public void setId_pais(Short id_pais) {
        this.id_pais = id_pais;
    }

    public String getNom_pais() {
        return nom_pais;
    }

    public void setNom_pais(String nom_pais) {
        this.nom_pais = nom_pais;
    }

    public Long getNum_habitantes() {
        return num_habitantes;
    }

    public void setNum_habitantes(Long num_habitantes) {
        this.num_habitantes = num_habitantes;
    }

    public PaisServiceHibernate getPaisServiceHibernateImpl() {
        return paisServiceHibernateImpl;
    }

    public void setPaisServiceHibernateImpl(PaisServiceHibernate paisServiceHibernateImpl) {
        this.paisServiceHibernateImpl = paisServiceHibernateImpl;
    }  

    public TPaises gettPaises() {
        return tPaises;
    }

    public void settPaises(TPaises tPaises) {
        this.tPaises = tPaises;
    }

    public List getBeanList() {
        return beanList;
    }

    public void setBeanList(List beanList) {
        this.beanList = beanList;
    }

    public Integer getNumPaises() {
        return numPaises;
    }

    public void setNumPaises(Integer numPaises) {
        this.numPaises = numPaises;
    }    
    
    public void grabaOActualizaPais(ActionEvent event)
    {
        Short idPais = this.id_pais;
        String nomPais = this.nom_pais;
        Long numHabi = this.num_habitantes; 
         
        this.gettPaises().setNIdPaisPk(idPais); //puede ser null si es nuevo
        this.gettPaises().setVNombrePais(nomPais);//viene con trim y mayusculas
        this.gettPaises().setNNumHabitantesPais(numHabi);  //viene solo numeros     
       
        
        if( this.flagEditar == 0 )//nuevo
        {
            this.comprobarPaisGrabar(nomPais);
        }
        else //editar
        {
            if( this.nom_pais.equals(this.nom_pais_Editar) ) //no cambió al editar
            {
                this.grabaPais();
            }
            else
            {
                this.comprobarPaisGrabar(nomPais);                
            }
        }  
        
        this.flagEditar = 0;       
    }
    
    private void comprobarPaisGrabar(String nomPais)
    {
        List<TPaises> resultado = this.getPaisServiceHibernateImpl().findByNamePais(nomPais);
        if ( resultado.size() > 0 ) //no graba un entity con nombre duplicado 
        {
            this.paisExiste = "El pais digitado ya existe, por favor ingrese otro";
            this.color = "red";
        }
        else
        {
            this.grabaPais();
        }        
    }
    
    private void grabaPais()
    {
        this.getPaisServiceHibernateImpl().saveOrUpdatePais(this.tPaises);                       
        this.limpiarBean();//Valores limpios para el Objeto pais
        this.paisExiste = "Pais registrado correctamente";
        this.color = "green";
        this.setBeanList(this.getPaisServiceHibernateImpl().findAllPaises()); //traemos todos los paises para ser seteado en beanList    
        this.numPaises = this.beanList.size();
    }
        
    //borra un pais por ajax
    public void delete(ActionEvent event){        
               
        String id = (String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("sid2");//recuperamos el id       
               
        this.id_pais = Short.valueOf(id);
        
        this.tPaises.setNIdPaisPk(this.id_pais); 
       
        String mensaje = this.getPaisServiceHibernateImpl().deletePais(this.tPaises);
        
        this.limpiarBean();//Valores limpios para el Objeto pais
        if ( mensaje.equals("ok") ) //se hizo el delete correctamente
        {
            this.paisExiste = "Pais borrado correctamente";
            this.color = "green";                      
            this.setBeanList(this.getPaisServiceHibernateImpl().findAllPaises()); //traemos todos los paises para ser seteado en beanList            
            this.numPaises = this.beanList.size();            
        }     
        else
        {            
            this.paisExiste = "El Pais no pudo borrarse, posible violacion de la Integridad Referencial:    Causas ... " + mensaje;            
            this.color = "red";              
        }   
        
    }
    
    //Cargar los valores a los text de la vista, para ser actualizados
    public void load(ActionEvent event){ 
        this.flagEditar = 1;//esta en estado Editar
        this.limpiarBean();//Valores limpios para el Objeto pais
        String id = (String)FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("sid1");//recuperamos el id pasado como href      
         
        this.id_pais = Short.valueOf(id);           
                 
        TPaises pais = this.getPaisServiceHibernateImpl().findByIdPais(this.id_pais); 
        
        //Seteamos los campos para que sean actualizados por el usuario             
        this.setNom_pais(pais.getVNombrePais());
        this.setNum_habitantes(pais.getNNumHabitantesPais());        
        
        //guardamos el nombre
        this.nom_pais_Editar = pais.getVNombrePais();        
    }
    
    public void clean(ActionEvent event){ 
        this.limpiarBean();
    }
    
    private void limpiarBean(){    
        
        this.id_pais = null;
        this.setNom_pais(""); //ya que es string     
        this.num_habitantes = null;   //ya que es nuemrico     
        this.paisExiste = "";        
    }     

}
